//
//  卡顿优化.h
//  面试题
//
//  Created by Toj on 8/19/21.
//

卡顿优化 - CPU
尽量试用轻量级对象，比如用不到事件处理的地方可以考虑试用CALayer取代UIView
不要频繁的调用UIView的相关属性，比如frame、bounds、transform等属性，尽量减少不必要的修改
*尽量提前计算好布局，在有需要时一次性调整对应的属性，不要多次修改属性
Autolayout会比直接设置frame消耗更多的CPU资源
图片的size最好刚好跟UIImageView的size保持一致
控制一下线程的最大并发数量
*尽量把耗时的操作放在子线程，比如文本处理（尺寸计算、绘制），图片处理（解码、绘制）

卡顿优化 - GPU
尽量避免短时间内大量图片的显示，尽可能多张突变合成一张显示。
GPU能处理的最大纹理尺寸是 4096 x 4096，一旦超过这个尺寸，就会占用CPU资源进行处理，所以纹理尺寸尽量不要超过这个尺寸
尽量减少试图数量和层次
*减少透明的视图(alpha < 1)，不透明的就设置opaque为YES
*尽量避免出现离屏渲染(设置view的圆角、遮罩、阴影)

离屏渲染
1. 需要创建新的缓冲区
2. 离屏渲染的整个过程，需要多次切换上下文环境，显示从当前屏幕切换到离屏，等到离屏渲染结束后，将离屏缓冲区的渲染结果显示到屏幕上，又需要将上下文环境从离屏切换到当前屏幕。
on-Screen Rendering：当前屏幕渲染，在当前用于显示的屏幕缓冲区进行渲染操作
off-Screen Rendering：离屏渲染，在当前屏幕缓冲区以外开辟一个新的缓冲区进行渲染操作

1. 光栅化，layer.shouldRasterize = YES;
  2. 遮罩，layer.mask
  3. 圆角，同时设置layer.masksToBounds = YES，layer.cornerRadius 大于 0
可以考虑通过CoreGraphice绘制裁剪圆角，或者叫美工提供圆角图片。
  4. 阴影，layer.shadowXXX，如果设置了layer.shadowPath 就不会产生离屏渲染

性能优化 - 耗电优化
app中主要的耗电来源于： CPU处理、网络、定位、图像处理

优化方案：

尽可能降低CPU、GPU功耗
减少使用定时器
优化I/O操作，例如：
尽量不要频繁的写入小数据，最好批量一次写入
读写大量重要数据时，考虑用dispatch_io，其提供了基于GCD的异步操作文件I/O的的API。用dispatch_io系统会优化磁盘访问
数据量比较大时，建议使用数据库(比如SQLite、CoreData)


网络优化

减少、压缩网络数据
如果多次请求的结果是相同的，尽量使用缓存
使用断点续传，否则网络不稳定时可能多次传输相同的内容
网络不可用时，不要尝试执行网路请求
让用户可以取消长时间运行或者速度很慢的网络操作，设置合适的超时时间
批量传输，比如：下载视频时，不要传输很小的数据包，直接下载整个文件或者一大块一大块的下载。如果下载广告，一次性多下载一些，然后在慢慢展示。如果下载电子邮件，一次下载多封，不要一封一封的下载

性能优化 - APP启动优化

dyld
runtime
main

四  安装包瘦身
